/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tsb.xml;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import tsb.dominio.dispositivos.DNS;
import tsb.dominio.dispositivos.HTTP;
import tsb.dominio.dispositivos.NombresDeDominios;
import tsb.dominio.dispositivos.Servicio;
import tsb.dominio.dispositivos.coneccion.Modem;
import tsb.dominio.dispositivos.coneccion.Router;
import tsb.dominio.dispositivos.coneccion.Switch;
import tsb.dominio.dispositivos.hosfinal.PC;
import tsb.dominio.dispositivos.hosfinal.Server;
import tsb.dominio.enumeraciones.AsignacionIP;
import tsb.dominio.excepciones.MACException;
import tsb.dominio.interfaces.*;

/**
 *
 * @author Luciano
 */
public class Handler extends DefaultHandler {

    private tsb.gestores.GestorGrafo gestorGrafo;
    PC pc;
    Server server;
    Router router;
    Switch swi;
    Modem modem;
    DNS dns;
    ArrayList<tsb.dominio.interfaces.InterfaceDeConeccion> interfaces;
    Ethernet e;
    IP ipGateway, ipDNS;
    Boolean estoyEnPC;
    Boolean estoyEnRouter;
    Boolean estoyEnSwitch;
    Boolean estoyEnModem;
    Boolean estoyEnServer;

    public Handler(tsb.gestores.GestorGrafo g) {
        gestorGrafo = g;
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.print("Fin");
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (localName.equalsIgnoreCase("Dispositivos")) {
        } else if (localName.equalsIgnoreCase("Dispositivo")) {
            if (estoyEnPC) {
                gestorGrafo.agregarDispositivo(pc);
            }
            if (estoyEnModem) {
                gestorGrafo.agregarDispositivo(modem);
            }
            if (estoyEnRouter) {
                gestorGrafo.agregarDispositivo(router);
            }
            if (estoyEnServer) {
                gestorGrafo.agregarDispositivo(server);
            }
            if (estoyEnSwitch) {
                gestorGrafo.agregarDispositivo(swi);
            }
        } else if (localName.equalsIgnoreCase("DNS")) {
            if (estoyEnServer) {
                server.getServicios().add(dns);
            }
        }
        if(localName.equalsIgnoreCase("Conexiones")){

        }
    }

    @Override
    public void startDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (localName.equalsIgnoreCase("Dispositivos")) {
        } else if (localName.equalsIgnoreCase("Dispositivo")) {
            estoyEnPC = false;
            estoyEnRouter = false;
            estoyEnSwitch = false;
            estoyEnModem = false;
            estoyEnServer = false;

            if (attributes.getValue("tipo").equalsIgnoreCase("PC")) {
                encontrePC(attributes);
            } else if (attributes.getValue("tipo").equalsIgnoreCase("Server")) {
                encontreServer(attributes);

            } else if (attributes.getValue("tipo").equalsIgnoreCase("Router")) {
                encontreRouter(attributes);

            } else if (attributes.getValue("tipo").equalsIgnoreCase("Switch")) {
                encontreSwitch(attributes);

            } else if (attributes.getValue("tipo").equalsIgnoreCase("Modem"))// es modem
            {
                encontreModem(attributes);
            }
        } else if (localName.equalsIgnoreCase("IPGateway")) {
            encontreIPGateway(attributes);
        } else if (localName.equalsIgnoreCase("IPDNS")) {
            encontreIPDNS(attributes);
        } else if (localName.equalsIgnoreCase("Interfaces")) {
        } else if (localName.equalsIgnoreCase("InterfazEthernet")) {
            try {
                encontreInterfazEthernet(attributes);
            } catch (MACException ex) {
                Logger.getLogger(Handler.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (localName.equalsIgnoreCase("InterfazFazEthernetRJ45")) {
            try {
                encontreEthernetRJ45(attributes);
            } catch (MACException ex) {
                Logger.getLogger(Handler.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (localName.equalsIgnoreCase("InterfazFastEthernetFibraOptica")) {
            try {
                encontreFibraFastEthernet(attributes);
            } catch (MACException ex) {
                Logger.getLogger(Handler.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (localName.equalsIgnoreCase("InterfazGigabitRJ45")) {
            try {
                encontreGigabitRJ45(attributes);
            } catch (MACException ex) {
                Logger.getLogger(Handler.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (localName.equalsIgnoreCase("InterfazGigabitFibraOptica")) {
            try {
                encontreGigabitFibraOptica(attributes);
            } catch (MACException ex) {
                Logger.getLogger(Handler.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (localName.equalsIgnoreCase("InterfazSerial")) {
            encontreInterfazSerial(attributes);
        } else if (localName.equalsIgnoreCase("InterfazWireless")) {
        } else if (localName.equalsIgnoreCase("InterfazModem")) {
        } else if (localName.equalsIgnoreCase("HTTP")) {
            encontreHTTP(attributes);
        } else if (localName.equalsIgnoreCase("DHCP")) {
        } else if (localName.equalsIgnoreCase("FTP")) {
        } else if (localName.equalsIgnoreCase("Archivo")) {
        } else if (localName.equalsIgnoreCase("DNS")) {
            encontreDNS(attributes);
        } else if (localName.equalsIgnoreCase("NombreDominio")) {
            encontreNombreDominio(attributes);
        } else if (localName.equalsIgnoreCase("InterfazEthernetSwitc")) {
        } else if (localName.equalsIgnoreCase("Conexiones")) {
        } else if (localName.equalsIgnoreCase("InterfazLineaTelefonicaModem")) {
            encontreInterfazLineaTelefonicaModem(attributes);
        } else if (localName.equalsIgnoreCase("Conexion")) { // TODO procesar conexiones
            if (attributes.getValue("tipo").equalsIgnoreCase("RJ45")) {} 
              else if (attributes.getValue("tipo").equalsIgnoreCase("FibraOptica")) {
            } else if (attributes.getValue("tipo").equalsIgnoreCase("SerialDTE")) {
            } else if (attributes.getValue("tipo").equalsIgnoreCase("SerialDCE")) {
            } else // es "automatica"
            {
            }
        }

    }
// encontre encontreHTTP

    private void encontreHTTP(Attributes attributes) {
        HTTP http = new HTTP();
        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            http.setEstado(true);
        } else {
            http.setEstado(false);
        }
        http.setHTML(attributes.getValue("html"));
    }

    private void encontreInterfazSerial(Attributes attributes) {
        Serial serial = new Serial();

        serial.setAnchoDeBanda(Integer.parseInt(attributes.getValue("anchoDeBanda")));
        serial.setIP(new IP(attributes.getValue("IP")));
        serial.setSubnetMask(new IP(attributes.getValue("mascara")));
        serial.setClockRate(Integer.parseInt(attributes.getValue("clockRate")));

        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            serial.setEstado(true);
        } else {
            serial.setEstado(false);
        }

        if (estoyEnPC) {
            pc.getInterfaces().add(serial);
        }
        if (estoyEnRouter) {
            router.getInterfaces().add(serial);
        }
        if (estoyEnServer) {
            server.getInterfaces().add(serial);
        }
    }

    private void encontreGigabitFibraOptica(Attributes attributes) throws MACException {
        FibraOpticaGigabit fibraGigabit = new FibraOpticaGigabit();

        fibraGigabit.setAnchoDeBanda(Integer.parseInt(attributes.getValue("anchoDeBanda")));
        fibraGigabit.setIP(new IP(attributes.getValue("IP")));
        fibraGigabit.setMac(new MAC(attributes.getValue("mac")));
        fibraGigabit.setSubnetMask(new IP(attributes.getValue("mascara")));

        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            fibraGigabit.setEstado(true);
        } else {
            fibraGigabit.setEstado(false);
        }

        if (attributes.getValue("modoDuple").equalsIgnoreCase("Duplex")) {
            fibraGigabit.setDuplex(true);
        } else {
            fibraGigabit.setDuplex(false);
        }
        if (estoyEnPC) {
            pc.getInterfaces().add(fibraGigabit);
        }
        if (estoyEnRouter) {
            router.getInterfaces().add(fibraGigabit);
        }
        if (estoyEnServer) {
            server.getInterfaces().add(fibraGigabit);
        }
    }

    private void encontreGigabitRJ45(Attributes attributes) throws MACException {
        RJ45Gigabit gigabit = new RJ45Gigabit();
        gigabit.setAnchoDeBanda(Integer.parseInt(attributes.getValue("anchoDeBanda")));
        gigabit.setIP(new IP(attributes.getValue("IP")));
        gigabit.setMac(new MAC(attributes.getValue("mac")));
        gigabit.setSubnetMask(new IP(attributes.getValue("mascara")));

        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            gigabit.setEstado(true);
        } else {
            gigabit.setEstado(false);
        }

        if (attributes.getValue("autoDuplex").equalsIgnoreCase("true")) {
            gigabit.setDeteccionAutomaticaAnchoBandaDuplex(true);
        } else {
            gigabit.setDeteccionAutomaticaAnchoBandaDuplex(false);
        }

        if (attributes.getValue("modoDuple").equalsIgnoreCase("Duplex")) {
            gigabit.setDuplex(true);
        } else {
            gigabit.setDuplex(false);
        }
        if (estoyEnPC) {
            pc.getInterfaces().add(gigabit);
        }
        if (estoyEnRouter) {
            router.getInterfaces().add(gigabit);
        }
        if (estoyEnServer) {
            server.getInterfaces().add(gigabit);
        }
    }

    private void encontreFibraFastEthernet(Attributes attributes) throws MACException {
        FibraOpticaFastEthernet fibra = new FibraOpticaFastEthernet();
        fibra.setAnchoDeBanda(Integer.parseInt(attributes.getValue("anchoDeBanda")));
        fibra.setIP(new IP(attributes.getValue("IP")));
        fibra.setMac(new MAC(attributes.getValue("mac")));
        fibra.setSubnetMask(new IP(attributes.getValue("mascara")));

        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            fibra.setEstado(true);
        } else {
            fibra.setEstado(false);
        }
        if (estoyEnPC) {
            pc.getInterfaces().add(fibra);
        }
        if (estoyEnRouter) {
            router.getInterfaces().add(fibra);
        }
        if (estoyEnServer) {
            server.getInterfaces().add(fibra);
        }
    }

    private void encontreEthernetRJ45(Attributes attributes) throws MACException {
        RJ45FastEthernet rj45 = new RJ45FastEthernet();
        rj45.setAnchoDeBanda(Integer.parseInt(attributes.getValue("anchoDeBanda")));
        rj45.setIP(new IP(attributes.getValue("IP")));
        rj45.setMac(new MAC(attributes.getValue("mac")));
        rj45.setSubnetMask(new IP(attributes.getValue("mascara")));

        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            rj45.setEstado(true);
        } else {
            rj45.setEstado(false);
        }

        if (attributes.getValue("autoDuplex").equalsIgnoreCase("true")) {
            rj45.setDeteccionAutomaticaAnchoBandaDuplex(true);
        } else {
            rj45.setDeteccionAutomaticaAnchoBandaDuplex(false);
        }

        if (attributes.getValue("modoDuple").equalsIgnoreCase("Duplex")) {
            rj45.setDuplex(true);
        } else {
            rj45.setDuplex(false);
        }

        if (estoyEnPC) {
            pc.getInterfaces().add(rj45);
        }
        if (estoyEnRouter) {
            router.getInterfaces().add(rj45);
        }
        if (estoyEnServer) {
            server.getInterfaces().add(rj45);
        }

    }

    private void encontreInterfazEthernet(Attributes attributes) throws MACException {
        Ethernet e = new Ethernet();
        // e.setAnchoDeBanda(Integer.valueOf(attributes.getValue("anchoDeBanda")));
        e.setIP(new IP(attributes.getValue("IP")));
        e.setMac(new MAC(attributes.getValue("mac")));
        e.setSubnetMask(new IP(attributes.getValue("mascara")));

        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            e.setEstado(true);
        } else {
            e.setEstado(false);
        }

        if (attributes.getValue("autoDuplex").equalsIgnoreCase("true")) {
            e.setDetecionAutomaticaAnchoBnadaDuplex(true);
        } else {
            e.setDetecionAutomaticaAnchoBnadaDuplex(false);
        }

        if (attributes.getValue("modoDuple").equalsIgnoreCase("Duplex")) {
            e.setDuplex(true);
        } else {
            e.setDuplex(false);
        }


        if (estoyEnPC) {
            pc.getInterfaces().add(e);
        }
        if (estoyEnModem) {
            modem.getInterfaces().add(e);
        }
        if (estoyEnRouter) {
            router.getInterfaces().add(e);
        }
        if (estoyEnServer) {
            server.getInterfaces().add(e); 
        }
        if (estoyEnSwitch) {
            server.getInterfaces().add(e);
        }
    }

    private void encontreIPDNS(Attributes attributes) {
        IP ip = new IP(attributes.getValue("ip"));
        if (estoyEnPC) {
            pc.setServidorDNS(ip);
        } else {
            server.setGateway(ip);
        }
    }

    private void encontreIPGateway(Attributes attributes) {
        IP ip = new IP(attributes.getValue("ip"));
        if (estoyEnPC) {
            pc.setGateway(ip);
        } else {
            server.setGateway(ip);
        }
    }

    private void encontreModem(Attributes attributes) throws NumberFormatException {
        estoyEnModem = true;
        interfaces = new ArrayList<InterfaceDeConeccion>();
        int x = Integer.parseInt(attributes.getValue("posX"));
        int y = Integer.parseInt(attributes.getValue("posY"));
        String nombre = attributes.getValue("nombreAMostrar");
        modem = new Modem(x, y, nombre,interfaces);
        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            modem.setEstado(true);
        } else {
            modem.setEstado(false);
        }
    }

    private void encontreSwitch(Attributes attributes) throws NumberFormatException {
        estoyEnSwitch = true;
        interfaces = new ArrayList<InterfaceDeConeccion>();
        int x = Integer.parseInt(attributes.getValue("posX"));
        int y = Integer.parseInt(attributes.getValue("posY"));
        String nombre = attributes.getValue("nombreAMostrar");
        swi = new Switch(x, y, nombre, interfaces);

        if (attributes.getValue("estado").equalsIgnoreCase("true")) {
            swi.setEstado(true);
        } else {
            swi.setEstado(false);
        }
    }

    private void encontreRouter(Attributes attributes) throws NumberFormatException {
        estoyEnRouter = true;
        interfaces = new ArrayList<InterfaceDeConeccion>();
        int x = Integer.parseInt(attributes.getValue("posX"));
        int y = Integer.parseInt(attributes.getValue("posY"));
        String hostName = attributes.getValue("hostName");
        router = new Router(x, y, hostName, interfaces);
        if (attributes.getValue("estado").equalsIgnoreCase("true")) {
            router.setEstado(true);
        } else {
            router.setEstado(false);
        }
    }

    private void encontreServer(Attributes attributes) throws NumberFormatException {
        estoyEnServer = true;
        ArrayList<tsb.dominio.dispositivos.Servicio> servicios = new ArrayList<Servicio>();
        interfaces = new ArrayList<InterfaceDeConeccion>();
        int x = Integer.parseInt(attributes.getValue("posX"));
        int y = Integer.parseInt(attributes.getValue("posY"));
        String nombre = attributes.getValue("nombreAMostrar");
        server = new Server(x, y, nombre, interfaces);
        server.setServicios(servicios);
        if (attributes.getValue("estado").equalsIgnoreCase("true")) {
            server.setEstado(true);
        } else {
            server.setEstado(false);
        }
        if (attributes.getValue("asignacionIP").equalsIgnoreCase("DHCP")) {
            server.setDHCP_Static(AsignacionIP.DCHP);
        } else {
            server.setDHCP_Static(AsignacionIP.Static);
        }
    }

    private void encontrePC(Attributes attributes) throws NumberFormatException {
        estoyEnPC = true;
        interfaces = new ArrayList<InterfaceDeConeccion>();
        int x = Integer.parseInt(attributes.getValue("posX"));
        int y = Integer.parseInt(attributes.getValue("posY"));
        String nombre = attributes.getValue("nombreAMostrar");
        pc = new PC(x, y, nombre, interfaces);
        if (attributes.getValue("asignacionIP").equalsIgnoreCase("DHCP")) {
            pc.setDHCP_Static(AsignacionIP.DCHP);
        } else {
            pc.setDHCP_Static(AsignacionIP.Static);
        }
        if (attributes.getValue("estado").equalsIgnoreCase("true")) {
            pc.setEstado(true);
        } else {
            pc.setEstado(false);
        }
    }
    // TODO revisar si funca bien esto

    private void encontreDNS(Attributes attributes) {
        // Solo se le agrega al server
        ArrayList list = new ArrayList();
        dns = new DNS(false, list);
        if (attributes.getValue("encendido").equalsIgnoreCase("true")) {
            dns.setEstado(true);
        } else {
            dns.setEstado(false);
        }
    }

    private void encontreNombreDominio(Attributes attributes) {
        NombresDeDominios nombre = new NombresDeDominios();
        nombre.setIp(new IP(attributes.getValue("IP")));
        nombre.setNombreDeDominio(attributes.getValue("nombre"));
        dns.getNombresDeDominio().add(nombre);
    }

    private void encontreInterfazLineaTelefonicaModem(Attributes attributes) {
        InterfazModemRouter inter = new InterfazModemRouter();
        if (attributes.getValue("encendida").equalsIgnoreCase("true")) {
            inter.setEstado(true);
        } else {
            inter.setEstado(false);
        }
        modem.getInterfaces().add(inter);
    }
    
    
    
}
